// 定义一个函数 increase，接受四个参数 a, b, c, d，并返回它们的和
const increase = (a, b, c, d) => {
  return a + b + c + d
}

// 定义一个柯里化函数 curry，接受一个函数 fn 作为参数
function curry(fn) {
  // 返回一个新的函数 curried，该函数接受任意数量的参数
  return function curried(...args) {
    // 如果传入的参数数量大于等于原函数的参数数量，则直接调用原函数
    if (args.length >= fn.length) {
      return fn.apply(this, args)
    } else {
      // 否则返回一个新的函数，继续接受参数
      return function (...moreArgs) {
        // 将新参数与之前的参数合并，并递归调用 curried
        return curried.apply(this, args.concat(moreArgs))
      }
    }
  }
}

// 使用 curry 函数对 increase 函数进行柯里化
const curriedAdd = curry(increase)

// 调用 curriedAdd 函数，分多次传入参数，最终计算出结果 100
console.log(curriedAdd(10)(20)(30)(40)) // 100
